package pres.seanlang.utility;

/**
 *  字符串工具类
 *
 * @author SeanLang
 */
public final class StringUtils {
    protected StringUtils() { throw new UnsupportedOperationException("u can't instance..."); }

    /**
     *  检查字符串是否为null或者长度为0
     * @param src
     * @return
     */
    public static boolean isEmpty(String src) {
        return ((src == null) || (src.length() == 0));
    }

    /**
     * 检测字符是否为null或者是否为空白字符串
     * @param src
     * @return
     */
    public static boolean isTrimEmpty(String src) {
        return ((src == null) || (src.trim().length() == 0));
    }

    /**
     *  比较字符串是否相同
     *     支持null判断
     * @param src
     * @param dst
     * @return
     */
    public static boolean equals(String src, String dst) {
        if(src == dst) { return true; }
        if(src != null && dst != null && src.length() == dst.length()) {
            if(src instanceof String && dst instanceof String) {
                return src.equals(dst);
            } else {
                for (int i=0; i<src.length(); i++) {
                    if(src.charAt(i) != dst.charAt(i)) {
                        return false;
                    }
                }
                return true;
            }
        }

        return false;
    }

    /**
     *  比较字符串是否相同，且忽略大小写.
     * @param src
     * @param dst
     * @return
     */
    public static boolean equalsIgnoreCase(String src, String dst) {
        if(src == dst) { return true; }
        if(src != null && dst != null && src.length() == dst.length()) {
            return src.equalsIgnoreCase(dst);
        }

        return false;
    }

    /**
     * 获取字符串的长度, 如果null返回0.
     * @param src
     * @return
     */
    public static int length(String src) {
        return src == null ? 0 : src.length();
    }

    /**
     *  转换首字母到大写
     * @param src
     * @return
     */
    public static String upperFirstLetter(String src) {
        if( isEmpty(src) ||
                !Character.isLetter(src.charAt(0)) ||
                Character.isUpperCase(src.charAt(0)) ) {
            return src;
        } else {
            return ((char)(src.charAt(0)-32)) + src.substring(1);
        }
    }

    /**
     *  转换首字母到小写
     * @param src
     * @return
     */
    public static String lowerFirstLetter(String src) {
        if( isEmpty(src) ||
                !Character.isLetter(src.charAt(0)) ||
                Character.isLowerCase(src.charAt(0)) ) {
            return src;
        } else {
            return ((char)(src.charAt(0)+32)) + src.substring(1);
        }
    }

    /**
     *  检测是否为纯数字字符串，
     * @param src
     * @return
     */
    public static boolean isPureNumber(String src) {
        for(int i = 0; i < src.length(); i++) {
            if(src.charAt(i) < 48 || src.charAt(i) > 57) {
                return false;
            }
        }

        return true;
    }

    /**
     *  检测是否十六进制字符串,也可以包含0x头
     * @param src
     * @return
     */
    public static boolean isHexNumber(String src) {
        int strIndex = 0;
        if(src.charAt(0) == '0' &&
                (src.charAt(1) == 'x' || src.charAt(1) == 'X')) {
            //s = src.substring(2);
            strIndex = 2;
        }

        //数字ascii 数字范围48~57; 大小写A~F范围65~70/97~102
        for(int i = strIndex; i < src.length(); i++) {
            if(src.charAt(i) < 48) {
                return false;
            } else if(src.charAt(i) > 57 && src.charAt(i) < 65) {
                return false;
            } else if(src.charAt(i) > 70 && src.charAt(i) < 97) {
                return false;
            } else if(src.charAt(i) > 102) {
                return false;
            }
        }

        return true;
    }

    /**
     *  转换int <br>
     *     支持16进制或者包含0x的16进制字符串.<br>
     *
     * @param src
     * @return  如果是空字符串或者不符合要求的字符串则return 0
     */
    public static int toInt(String src) {
        if(isTrimEmpty(src)) { return 0; }

        //检查是否都是数字字符串
        if(isPureNumber(src)) {
            return Integer.parseInt(src);
        } else if(isHexNumber(src)) {
            String s = src;
            if((src.charAt(0) == '0') &&
                    ((src.charAt(1) == 'x') || (src.charAt(1) == 'X'))) {
                s = src.substring(2);
            }
            return Integer.parseInt(s, 16);
        } else {
            return 0;
        }
    }

    /**
     *  转换long <br>
     *     支持16进制或者包含0x的16进制字符串.<br>
     *
     * @param src
     * @return  如果是空字符串或者不符合要求的字符串则return 0
     */
    public static long toLong(String src) {
        if(isTrimEmpty(src)) { return 0; }

        //检查是否都是数字字符串
        if(isPureNumber(src)) {
            return Long.parseLong(src);
        } else if(isHexNumber(src)) {
            String s = src;
            if((src.charAt(0) == '0') &&
                    ((src.charAt(1) == 'x') || (src.charAt(1) == 'X'))) {
                s = src.substring(2);
            }
            return Long.parseLong(s, 16);
        } else {
            return 0;
        }
    }

    /**
     *  转换double <br>
     * @param src
     * @return
     */
    public static double toDouble(String src) {
        if(isTrimEmpty(src)) { return 0.0; }

        String[] pureNumbers = src.split("\\.");
        char suffix = pureNumbers[1].charAt(pureNumbers[1].length() - 1);
        if(suffix == 'f' || suffix == 'F') {
            pureNumbers[1] = pureNumbers[1].substring(0, pureNumbers[1].length() - 1);
        }

        if(pureNumbers.length != 2
                || !isPureNumber(pureNumbers[0]) || !isPureNumber(pureNumbers[1])) {
            return 0.0;
        } else {
            return Double.parseDouble(src);
        }
    }

    /**
     *  转换boolean <br>
     * @param src
     * @return
     */
    public static boolean toBoolean(String src) {
        if(isEmpty(src) ||
                (!"true".equalsIgnoreCase(src) && !"false".equalsIgnoreCase(src))) {
            return false;
        } else {
            return Boolean.parseBoolean(src);
        }
    }
}
